package com.xie.leetcode.characterstring;

//验证回文串
//        给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
//
//        说明：本题中，我们将空字符串定义为有效的回文串。
//
//         
//
//        示例 1:
//
//        输入: "A man, a plan, a canal: Panama"
//        输出: true
//        解释："amanaplanacanalpanama" 是回文串
//        示例 2:
//
//        输入: "race a car"
//        输出: false
//        解释："raceacar" 不是回文串
//         
//
//        提示：
//
//        1 <= s.length <= 2 * 105
//        字符串 s 由 ASCII 字符组成
//        相关标签
//        双指针
//        字符串
//
//        作者：力扣 (LeetCode)
//        链接：https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xne8id/
//        来源：力扣（LeetCode）
//        著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

/**
 * @author xiezhendong
 * @date 2021/10/22
 */
public class IsPalindrome {

    public static void main(String[] args) {
        IsPalindrome isPalindrome = new IsPalindrome();
        System.out.println(isPalindrome.isPalindrome("A man, a plan, a canal: Panama"));
        System.out.println(isPalindrome.isPalindrome("race a car"));
    }

    public boolean isPalindrome(String s) {
        if (s == null || "".equals(s)){
            return true;
        }
        char[] chars = s.toCharArray();
        int right = chars.length - 1;
        for (int i = 0; i < chars.length; i++, right--) {
            if (i >= right) {
                break;
            }
            // 判断是否是字母若不是，跳过
            while (i < right && !Character.isLetterOrDigit(chars[i])) {
                i++;
            }
            while (i < right && !Character.isLetterOrDigit(chars[right])) {
                right--;
            }
            String lStr = String.valueOf(chars[i]);
            String rStr = String.valueOf(chars[right]);
            if (!lStr.toLowerCase().equals(rStr.toLowerCase())) {
                return false;
            }
        }
        return true;
    }
}
